package main

import (
	"fmt"
	"sync"
)

func consumer(queue chan int) {
	defer wg.Done()
	for data := range queue {
		fmt.Println(data)
	} //会自动判断管道是否已经关闭

	// 手动判断是否已经关闭
	//for {
	//	data, ok := <-queue
	//	if !ok {
	//		break
	//	}
	//	fmt.Println(data, ok)
	//	time.Sleep(time.Second)
	//}

}

var wg sync.WaitGroup

func main() {
	/*
	 chennel 提供了一种通信机制，定向
	*/

	var msg chan int // 放的类型

	// 初始化这个channel
	//msg = make(chan int)    // 第一种初始化方式： 无缓冲 .// 会死锁 // 不能先放东西，需要先有接受者
	msg = make(chan int, 1) // 第二种方式： 有缓冲空间的 // 如果先放东西就只能放缓冲大小的东西，不能放超出

	//在go 中 make 初始化有三种，1.slice 2. map  3.channel

	//msg <- 2 //  你这个管道看起来就是一个有空间的数组 // 死锁
	wg.Add(1)
	go consumer(msg)
	msg <- 1 // 将1 放入到channel 中
	msg <- 2
	close(msg) // 关闭channel ，已经关闭的channel 不能再发送数据了
	// 已经挂壁的channel 能够继续取数据，直到数据取完为止
	wg.Wait()
	//data := <-msg
	//fmt.Println(data) // 会报死锁的错误

}
